# -*- coding: utf-8 -*-
"""
str() 函数的专用回调处理器

处理 str 类型转换的不同场景：
1. 对于有 __str__ 方法的类型，调用 __str__()
2. 对于没有 __str__ 方法的类型，使用默认的模板转换
"""

from typing import Optional
from mcpy.ir.expressions.call import IRCall
from mcpy.codegen.core.context import CodeGenContext
from mcpy.codegen.core.emitter import EmitResult


class StrFunctionCallback:
    """str() 函数的回调处理器"""

    def emit(self, node: IRCall, context: CodeGenContext) -> Optional[EmitResult]:
        """生成 str() 调用的代码

        Args:
            node: IRCall 节点
            context: 代码生成上下文

        Returns:
            EmitResult 或 None（如果不处理）
        """
        from mcpy.codegen.core.generator import get_global_generator

        generator = get_global_generator()
        if not node.args or len(node.args) == 0:
            return None

        arg = node.args[0]
        arg_code = generator.generate_expression(arg, context, parent_precedence=100)
        arg_type_info = arg.get_extension_param("inferred_type")
        if not arg_type_info or not context.current_node:
            return None

        method_symbol = context.current_node.lookup_symbol(
            "__str__",
            owner_type=arg_type_info,
            func_args=[],
        )

        if not method_symbol:
            return None

        matching_signature = method_symbol.find_matching_signature([arg_type_info])
        if not matching_signature and method_symbol.signatures:
            matching_signature = method_symbol.signatures[0]

        if matching_signature:
            template = matching_signature.emit_template
            if template:
                code = template.replace("{self}", arg_code)
                return EmitResult(code=code, precedence=2)

        return None
